package com.ittao.taoaicodecommon.manage.storage.entity;

import lombok.Data;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 性能指标实体
 * 用于记录和计算操作性能指标
 */
@Data
public class PerformanceMetrics {
    
    /**
     * 操作类型
     */
    private final String operationType;
    
    /**
     * 开始时间
     */
    private final long startTime;
    
    /**
     * 结束时间
     */
    private long endTime;
    
    /**
     * 文件数量
     */
    private long fileCount;
    
    /**
     * 总大小
     */
    private long totalSize;
    
    /**
     * 网络时间
     */
    private long networkTime;
    
    /**
     * IO时间
     */
    private long ioTime;
    
    /**
     * 错误信息
     */
    private String errorMessage;

    /**
     * 构造函数
     * @param operationType 操作类型
     */
    public PerformanceMetrics(String operationType) {
        this.operationType = operationType;
        this.startTime = System.currentTimeMillis();
    }

    /**
     * 记录目录统计信息
     * @param directory 目录路径
     */
    public void recordDirectoryStats(String directory) {
        try {
            Path dirPath = Paths.get(directory);
            if (Files.exists(dirPath) && Files.isDirectory(dirPath)) {
                Files.walk(dirPath)
                        .filter(Files::isRegularFile)
                        .forEach(file -> {
                            try {
                                this.fileCount++;
                                this.totalSize += Files.size(file);
                            } catch (Exception e) {
                                // 忽略单个文件的错误
                            }
                        });
            }
        } catch (Exception e) {
            // 记录错误但不抛出异常
            this.errorMessage = "Failed to record directory stats: " + e.getMessage();
        }
    }

    /**
     * 记录错误信息
     * @param errorMessage 错误信息
     */
    public void recordError(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    /**
     * 完成操作
     */
    public void complete() {
        this.endTime = System.currentTimeMillis();
    }

    /**
     * 获取持续时间
     * @return 持续时间（毫秒）
     */
    public long getDuration() {
        return endTime - startTime;
    }

    /**
     * 获取吞吐量（MB/s）
     * @return 吞吐量
     */
    public double getThroughputMBps() {
        long duration = getDuration();
        if (duration > 0 && totalSize > 0) {
            return (totalSize / 1024.0 / 1024.0) / (duration / 1000.0);
        }
        return 0.0;
    }

    /**
     * 获取IO时间
     * @return IO时间（毫秒）
     */
    public long getIOTime() {
        // 简单估算：总时间减去网络时间
        return Math.max(0, getDuration() - networkTime);
    }
}